
#include "UdpSocket.h"

extern "C"
{
	static pj_bool_t udp_on_data_recvfrom(pj_activesock_t *asock,
				  void *data,
				  pj_size_t size,
				  const pj_sockaddr_t *src_addr,
				  int addr_len,
				  pj_status_t status)
	{
		UdpSocket *p_sock = (UdpSocket*) pj_activesock_get_user_data(asock);
		return p_sock->OnDataRecvFrom(data,size,src_addr,addr_len,status);
	}

	static pj_bool_t udp_on_data_sent(pj_activesock_t *asock,pj_ioqueue_op_key_t *op_key,
					pj_ssize_t sent)
	{
		UdpSocket *p_sock = (UdpSocket*) pj_activesock_get_user_data(asock);
		return p_sock->OnDataSend(op_key,sent);
	}

}

UdpSocket::UdpSocket(Proactor* proactor,char* ip,unsigned short port):BaseSocket(proactor,PJ_SOCK_DGRAM)
{
	pj_status_t status = 0;

	const pj_str_t pjstr = pj_str(ip);
	pj_sock_socket(pj_AF_INET(),pj_SOCK_DGRAM(),0,&sock);
	pj_sockaddr_init(pj_AF_INET(), &addr, &pjstr, port);

    pj_bzero(&cb, sizeof(cb));

	cb.on_data_recvfrom = &udp_on_data_recvfrom;
    cb.on_data_sent = &udp_on_data_sent;
}

UdpSocket::~UdpSocket()
{

}

int UdpSocket::SendTo(const char* buff,long& size,const pj_sockaddr_t *addr,
				int addr_len,int flags)
{
	pj_status_t status;
	status = pj_activesock_sendto(p_asock,&send_key,buff,&size,flags,addr,addr_len);

	return status;
}

int UdpSocket::SendTo(const char* buff,long& size,char* ip,
						unsigned short port,int flags)
{
	pj_sockaddr toaddr;
	const pj_str_t pjstr = pj_str(ip);

	pj_sockaddr_init(pj_AF_INET(), &toaddr, &pjstr, port);
	return SendTo(buff,size,&toaddr,pj_sockaddr_get_len(&toaddr),flags);
}

int UdpSocket::RecvFrom(long size,int flags)
{
	pj_status_t status;
	status = pj_activesock_start_recvfrom(p_asock,p_proactor->pool,size,flags);

	return status;
}

pj_bool_t UdpSocket::OnDataRecvFrom(void *data,pj_size_t size,
			const pj_sockaddr_t *src_addr,int addr_len,int status)
{
	return PJ_TRUE;
}

pj_bool_t UdpSocket::OnDataSend(pj_ioqueue_op_key_t *send_key,int sendsize)
{
	return PJ_TRUE;
}
